use hyper::{Body, Request, Response};
use log::info;

// 存储请求URL，供响应日志使用
thread_local!(static LAST_REQUEST_URL: std::cell::RefCell<Option<String>> = std::cell::RefCell::new(None));

pub async fn log_req(req: &Request<Body>) {
    // 只存储URL，不输出日志
    let url = req.uri().to_string();
    LAST_REQUEST_URL.with(|last_url| {
        *last_url.borrow_mut() = Some(url);
    });
}

pub async fn log_res(res: &Response<Body>) {
    // 获取之前存储的请求URL
    LAST_REQUEST_URL.with(|last_url| {
        if let Some(url) = last_url.borrow().clone() {
            // 输出URL、HTTP版本和带颜色的响应状态码
            let status_code = res.status().as_u16();
            let version = res.version();
            
            // 根据状态码设置不同的颜色
            let (color_start, color_end) = match status_code {
                // 1xx 信息响应 - 蓝色
                100..=199 => ("\x1b[34m", "\x1b[0m"),
                // 2xx 成功响应 - 绿色
                200..=299 => ("\x1b[32m", "\x1b[0m"),
                // 3xx 重定向响应 - 黄色
                300..=399 => ("\x1b[33m", "\x1b[0m"),
                // 4xx 客户端错误 - 红色
                400..=499 => ("\x1b[31m", "\x1b[0m"),
                // 5xx 服务器错误 - 紫色
                500..=599 => ("\x1b[35m", "\x1b[0m"),
                // 其他状态码 - 默认颜色
                _ => ("", "")
            };
            
            info!("{} {:?} {}{}{}", url, version, color_start, status_code, color_end);
        }
    });
}
